Amazon CloudFront のアクセスログを集計して TLS バージョンの使用状況をカウントしてみる
いわさです。
TLS 1.3 について調べていると、現在では多くのブラウザやクライアントアプリケーションのデフォルト挙動として TLS 1.3 がサポートされていることがわかりました。
現在は TLS 1.2 は非推奨とはなっていませんが、ALB など一部のサービスではセキュリティポリシーとして TLS 1.3 のみを許可するポリシーが用意されています。
私には今後の動向を予想できる能力はないのですが、現在のクライアントのサポート状況からすると TLS 1.3 以上が強制される未来に備えておいたほうが良いと思っています。
前述のとおり多くのクライアントでは TLS 1.3 が自動で使用される状況ですが、一部のレガシーブラウザ、あるいはクライアントアプリケーションの実装によっては TLS 1.2 が使われている場合があります。
そこで、まずは TLS 1.2 のサポートをしない場合にどの程度のクライアントに影響が発生するのかを把握したいところです。
AWS の各サービスはアクセスログを出力が出来ますので、例えば ALB であれば次のように TLS プロトコルバージョンの使用状況を確認することが出来ます。
CloudFront でも確認したい
各サービスでアクセスログを出力し、TLS プロトコルの使用状況を把握できるようにしておくアプローチはとても良いと思いました。
上記ブログは ALB のものですが、このログは各サービスによって違います。
幸い、CloudFront でも TLS プロトコルは出力項目に含まれているようなので、上記記事の応用で確認することが出来そうです。
やってみた
次のように新しいディストリビューションを作成します。
スクリーンショットを取るのを忘れていたのですが、アクセスログを S3 に出力するように構成しています。
ちなみに 2020 年 9 月ごろのアップデートで CloudFront の全てのセキュリティポリシーで TLS 1.3 がサポートされており、自動適用されています。
明示的にサーバーの最大 TLS バージョンを制限することは出来ません。
よって、クライアントが TLS 1.3 をサポートしていれば TLS 1.3 で通信が行われ、クライアントが TLS 1.2 までしかサポートしていなければ TLS 1.2 で通信されます。
念の為sslscan
コマンドでも確認してみますと、次のように TLS 1.2 と TLS 1.3 がサポートされています。
% sslscan https://hoge0419.fuga.tak1wa.com/ Version: 2.1.3 OpenSSL 3.2.1 30 Jan 2024 Connected to 13.225.183.25 Testing SSL server hoge0419.fuga.tak1wa.com on port 443 using SNI name hoge0419.fuga.tak1wa.com SSL/TLS Protocols: SSLv2 disabled SSLv3 disabled TLSv1.0 disabled TLSv1.1 disabled TLSv1.2 enabled TLSv1.3 enabled TLS Fallback SCSV: Server supports TLS Fallback SCSV TLS renegotiation: Session renegotiation not supported TLS Compression: OpenSSL version does not support compression Rebuild with zlib1g-dev package for zlib support Heartbleed: TLSv1.3 not vulnerable to heartbleed TLSv1.2 not vulnerable to heartbleed Supported Server Cipher(s): Preferred TLSv1.3 128 bits TLS_AES_128_GCM_SHA256 Curve 25519 DHE 253 Accepted TLSv1.3 256 bits TLS_AES_256_GCM_SHA384 Curve 25519 DHE 253 Accepted TLSv1.3 256 bits TLS_CHACHA20_POLY1305_SHA256 Curve 25519 DHE 253 Preferred TLSv1.2 128 bits ECDHE-RSA-AES128-GCM-SHA256 Curve 25519 DHE 253 Accepted TLSv1.2 256 bits ECDHE-RSA-AES256-GCM-SHA384 Curve 25519 DHE 253 Accepted TLSv1.2 256 bits ECDHE-RSA-CHACHA20-POLY1305 Curve 25519 DHE 253 :
リクエスト送信
そこで今回は、上記ディストリビューションに対して cURL を使って最大 TLS バージョンに TLS 1.2 と TLS 1.3 をそれぞれ指定していくつかリクエストを送信してみます。
TLS 1.3 で 20 回、TLS 1.2 で 5 回程度リクエストを送信しました。
% curl https://hoge0419.fuga.tak1wa.com/ --tls-max 1.3 hoge.html : % curl https://hoge0419.fuga.tak1wa.com/ --tls-max 1.3 hoge.html % curl https://hoge0419.fuga.tak1wa.com/ --tls-max 1.2 hoge.html : % curl https://hoge0419.fuga.tak1wa.com/ --tls-max 1.2 hoge.html
ログを確認
CloudFront のアクセスログは S3 に出力されているのでやはり Athena でクエリするのが一番楽かなと思います。
次の記事では CloudFront のアクセスログを Athena で集計していますので、こちらを応用させてもらいます。
CloudFront にはリアルタイムログと標準ログがあるのですが、今回は標準ログを使っています。
あとはssl_protocol
フィールドを集計するだけです。
次のように TLS バージョンごとの件数をカウントしてみました。
テスト送信したリクエストもあったので、概ね期待したとおりの結果になっていると思います。
さいごに
本日は Amazon CloudFront のアクセスログを集計して TLS バージョンの使用状況をカウントしてみました。
今回は標準フィールドに含まれている情報だったので難なく集計出来ましたね。
他のサービスでも集計できるか確認する際にはまずはアクセスログの出力フィールドを確認すると良さそうです。
良さそうですが、必ずしも出力フィールドに含まれていない場合や、ログフォーマットがドキュメントで明示されていないサービスがあります。
例えば API Gateway の場合だと次のような情報を出力できるのですが、こちらは SSL/TLS バージョンに関する情報は含まれていないようです。よってこの場合は別の方法を検討する必要がありそうです。